package com.qf.test;

import com.alibaba.fastjson.JSON;
import com.qf.pojo.User;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Pipeline;

import java.util.Date;

/**
 * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.test
 * @Description: 以json格式字符串到redis服务器存取数据
 * @Date 2022/6/29 14:24
 */
public class Demo3 {

    /**
     * 存入redis中json格式字符串
     */
    @Test
    public void testJsonSet() {
        //1.连接redis
        Jedis jedis = new Jedis("192.168.200.129", 6379);

        //2.准备json格式字符串类型的value数据
        User user = new User(2, "詹野种", new Date());
        String value = JSON.toJSONString(user);

        //3.使用set方法存入redis
        jedis.set("userJson",value);

        //4.关闭资源
        jedis.close();
    }

    /**
     * 获取redis中的json格式字符串
     */
    @Test
    public void testJsonGet() {
        //1.连接redis
        Jedis jedis = new Jedis("192.168.200.129", 6379);

        //2.从redis中获取json格式字符串
        String userJson = jedis.get("userJson");

        //3.将json格式字符串转换成java对象
        User user = JSON.parseObject(userJson, User.class);
        System.out.println(user);

        //4.关闭资源
        jedis.close();
    }

    /**
     * 测试jedis连接池
     */
    @Test
    public void testPool() {
        //1.创建连接池配置信息对象
        GenericObjectPoolConfig config = new GenericObjectPoolConfig();

        //最大连接数
        config.setMaxTotal(50);

        //最大空闲数
        config.setMaxIdle(10);

        //最小空闲数
        config.setMinIdle(5);

        //超时时间,也就是多久没有用连接,连接超时
        config.setMaxWaitMillis(3000);

        //2.创建连接池
        JedisPool jedisPool = new JedisPool(config, "192.168.200.129", 6379);

        //3.通过连接池获取jedis对象
        Jedis jedis = jedisPool.getResource();

        //4.获取redis中的数据
        String key1 = jedis.get("key1");
        System.out.println(key1);

        //5.释放资源
        jedis.close();

    }

    /**
     * 测试管道操作命令效率
     */
    @Test
    public void testPipiLine() {
        //1.创建连接池
        JedisPool jedisPool = new JedisPool("192.168.200.129", 6379);

        //开始时间
        long start = System.currentTimeMillis();

//        //2.获取一个连接,一个jedis对象
//        Jedis jedis = jedisPool.getResource();
//
//        //3.执行命令
//        for (int i = 0; i < 100000; i++) {
//            jedis.incr("key2");
//        }
//
//        //4.释放资源
//        jedis.close();

        //2.获取jedis对象
        Jedis jedis = jedisPool.getResource();

        //3.创建管道
        Pipeline pipelined = jedis.pipelined();

        //4.将需要执行的命令放入管道中
        for (int i = 0; i < 100000; i++) {
            pipelined.incr("key2");
        }

        //5.同一执行命令
        pipelined.syncAndReturnAll();

        //6.释放资源
        jedis.close();

        //结束时间
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }
}
